<?php
/**
 *
 * Project:     Neuf TV MediaCenter - MP9CTL
 * File:        common.inc.php
 *
 * Fonctions communes
 *
 * @author David G. pour Neuf Cegetel
 *
 */

/* Version */
define("VERSION", "1.17");
define("VERSION_DATE", "20071126");

/* Proprietes de tri */
define("SORT_BY_NAME", 16384);
define("SORT_BY_DATE", 8192);
define("SORT_REVERSE", 32768);

/* Definition des constantes Types de media */
define("MEDIA_VIDEO", 1);
define("MEDIA_AUDIO", 2);
define("MEDIA_IMAGE", 4);
define("MEDIA_DVD", 8);
define("MEDIA_AUDIOCD", 16);
define("MEDIA_RADIO", 32);
define("MEDIA_LIVETV", 64);
define("MEDIA_PLAYLIST", 128);

/* Definition des constantes Type de device */
define("DEVICE_HARDDISK", 1);
define("DEVICE_CDDVD", 2);
define("DEVICE_USBMASSSTORAGE", 4);
define("DEVICE_NETWORK", 8);
define("DEVICE_VIRTUAL", 16);
define("DEVICE_HOST", 32);

/* Definition des types par extension */
define("MEDIA_VIDEO_EXTENSION_MATCH", "/^(mpg|mpeg|mpe|ts|avi|asf|wmv|mp4|mov|qt|ogm|mkv|rmvb|flv|divx)$/");
define("MEDIA_AUDIO_EXTENSION_MATCH", "/^(mp2|mp3|wma|aif|aiff|aifc|mpga|ogg|ra|wav|aac|m4a)$/");
define("MEDIA_IMAGE_EXTENSION_MATCH", "/^(bmp|gif|jpg|jpeg|jpe|png|tif|tiff)$/");
define("MEDIA_PLAYLIST_EXTENSION_MATCH", "/^(m3u|xspf)$/");

/* Support natif Mediacenter */
define("NATIVE_SUPPORT_EXTENSION_MATCH", "/^(avi|asf|mpg|mpe|ts|mp4|m4t|wmv|divx|qt|mov|wav|aiff|aif|aifc|mpga|mp2|mp3|ogg|wma|bmp|gif|jpg|jpe|jpeg|png|tiff|tig|m3u|xspf|m4a|aac|mkv)$/");

/* Support Streamer externe */
define("STREAMER_SUPPORT", FALSE);
define("STREAMER_OUT_PORT", 26134);
define("STREAMER_SUPPORT_EXTENSION_MATCH","/^(mpg|mpeg|ts|mp2|mp3|avi|asf|wmv|wma|mp4|mov|qt|3gp|aif|aiff|ogg|ogm|mkv|rmvb|ra|wav|flv)$/");

/* Profondeur max de parcours dossiers */
define("BROWSE_MAX_DEPTH", 4);

/* Prefixe des partages */
define("SHARE_PREFIX", "__mp9ctl_share_");

/* Localisation des interfaces */
define("INTERFACE_DIR", "../interface/");
define("INTERFACE_URL", "http://".$_SERVER['HTTP_HOST']."/interface/");

$_PHPSELF = $_SERVER['PHP_SELF'];

/* Liste des partages */
$shares = array();

/**
 * Nom de la machine
 *
 * @return string - nom
 *
 **/
function getHostname() {
    if (getOSType() == 'windows') {
	if (isset($_ENV['COMPUTERNAME'])) return $_ENV['COMPUTERNAME'];
    }
    $serverName = $_SERVER['SERVER_NAME'];
    if (preg_match("/^\d+\.\d+\.\d+\.\d+$/", $serverName)) $serverName = gethostbyaddr($serverName);
    if (preg_match("/^(.*)\.(local|localnet)$/", $serverName, $matches)) {
	$serverName = $matches[1];
    }
    return $serverName;
}

/**
 * Type de systeme
 *
 * @return string - type ("windows", "macos", "other")
 *
 **/
function getOSType() {
    if (isset($_SERVER['OSType'])) return $_SERVER['OSType'];
    if (isset($_ENV['OS']) && !(strpos(strtolower($_ENV['OS']), 'windows')===FALSE)) return 'windows';
    if ((isset($_ENV['HOSTTYPE']) && $_ENV['HOSTTYPE'] == 'macintosh') || (isset($_ENV['TERM_PROGRAM']) && $_ENV['TERM_PROGRAM'] == 'Apple_Terminal')) return 'macos';
    return 'other';
}

/**
 * Ajout d'un partage de type folder
 *
 * @param number id - identifiant numerique du dossier
 * @param string name - nom du dossier tel qu'affiche
 * @param string path - chemin d'acces au dossier
 *
 **/
function addShareFolder($id, $name, $path) {
    global $shares;
    $shares[$id] = array(
	'id'=>$id, 
	'name'=>(getOSType() == 'windows' ? utf8_encode($name) : $name), 
	'path'=>$path);
}

/**
 * Chemin d'acces au fichier de configuration des partages
 *
 * @return string - repertoire
 *
 **/
function getConfFile() {
    switch (getOSType()) {
        case 'windows':
            return utf8_decode(getenv("ConfigFile"));
            break;
        default:
            return '../../data/shares.conf';
            break;
    }
}

/**
 * Liste des interfaces locales detectees
 *
 * return array ( (name, url) )
 *
 **/
function getInterfacesList() {
    $r = array();
    $dir = dir(INTERFACE_DIR);
    while (($file = readdir($dir->handle)) !== FALSE) {
	if (isUsableFileOrDir($dir->path.$file) && @is_dir($dir->path.$file)) {
	    $r[] = array("name" => $file, "url" => INTERFACE_URL.$file);
	}
    }
    return $r;
}

/**
 * Ajout d'un partage de type device
 *
 * @param number id - identifiant numerique du dossier
 * @param string name - nom du lecteur tel qu'affiche
 * @param string path - chemin d'acces au lecteur
 * @param number type - type de lecteur
 * @param boolean readOnly - lecteur en lecture seule
 *
 **/
function addShareDevice($id, $name, $path, $type, $readOnly) {
    global $shares;
    $shares[$id] = array('id'=>$id, 'name'=>$name, 'path'=>$path, 'type'=>$type, 'readOnly'=>$readOnly);
}

/**
 * Chemin d'acces complet a un dosser relatif a un partage
 *
 * @param string sharePath - chemin d'acces relatif a un partage
 * @return string - chemin d'acces complet
 *
 **/
function getRealPath($sharePath) {
    global $shares;
    if (preg_match("/^(\d+)([\\\\\/]+.*)$/", $sharePath, $matches)) {
	if (isset($shares[intval($matches[1])])) return $shares[intval($matches[1])]['path'].$matches[2];
    } else if (intval($sharePath) > 0 && isset($shares[intval($sharePath)])) {
	return $shares[intval($sharePath)]['path'];
    } 
    return false;
}

/**
 * Fichier ou repertoire utilisable
 *
 * @param string file - nom de fichier ou repertoire (chemin d'acces complet)
 * @return boolean - fichier ou repertoire utilisable
 *
 **/
function isUsableFileOrDir($filename) {
    /* Filtrage fichiers "caches" */
    if (substr(basename($filename), 0, 1) == '.') return false;
    /* Filtrage fichiers non lisibles */
    if ((!@is_dir($filename) && !@is_file($filename)) || !@is_readable($filename)) return false;
    /* Filtrage dossiers speciaux Windows */
    if (preg_match("/(recycler|system volume information|temporary internet files)$/i", $filename)) return false;
    return true;
}

/**
 * Type de media d'un fichier (determine a partir de son extension)
 *
 * @param string filename - nom du fichier
 * @return integer - type de media
 *
 **/ 
function getMediaTypeFromFilename($filename) {
    $fileinfo = pathinfo($filename);
    /* Type video */
    if (preg_match(MEDIA_VIDEO_EXTENSION_MATCH, strtolower($fileinfo['extension']))) return MEDIA_VIDEO;
    /* Type audio */
    if (preg_match(MEDIA_AUDIO_EXTENSION_MATCH, strtolower($fileinfo['extension']))) return MEDIA_AUDIO;
    /* Type image */
    if (preg_match(MEDIA_IMAGE_EXTENSION_MATCH, strtolower($fileinfo['extension']))) return MEDIA_IMAGE;
    /* Type playlist */
    if (preg_match(MEDIA_PLAYLIST_EXTENSION_MATCH, strtolower($fileinfo['extension']))) return MEDIA_PLAYLIST;
    return -1;
}

/**
 * Nom affichable d'un fichier
 * Remarque : supprime les caracteres . _
 *
 * @param string filename - nom du fichier
 * @return string - nom affichable
 *
 **/
function getDisplayNameFromFilename($filename) {
    $fileinfo = pathinfo($filename);
    /* Pour versions < PHP 5 */
    if (!isset($fileinfo['filename'])) {
	    if (strpos($fileinfo['basename'], '.') === FALSE) $filename = $fileinfo['basename'];
	    else $filename = substr($fileinfo['basename'], 0, strrpos($fileinfo['basename'], '.'));
    }
    else $filename = $fileinfo['filename'];
    
    /* Encodage en ISO -> UTF-8 si windows uniquement */
    if (getOSType() == "windows") $filename = utf8_encode($filename);
    return str_replace(array("_","."), " ", $filename);
}


/**
 * Support d'un fichier nativement par le mediacenter
 *
 * @param string filename - nom du fichier
 * @return boolean - fichier supporte
 * @return boolean - fichier supporte
 *
 **/ 
function nativeSupport($filename) {
    $fileinfo = pathinfo($filename);
    if (preg_match(NATIVE_SUPPORT_EXTENSION_MATCH, strtolower($fileinfo['extension']))) return TRUE;
    else return FALSE;
}

/**
 * Support d'un fichier par streamer externe
 *
 * @param string filename - nom du fichier
 * @return boolean - fichier supporte
 *
 **/
function externalStreamerSupport($filename) {
    $fileinfo = pathinfo($filename);
    if (STREAMER_SUPPORT && preg_match(STREAMER_SUPPORT_EXTENSION_MATCH, strtolower($fileinfo['extension']))) return TRUE;
    else return FALSE;
}

/**
 * URL d'acces a un fichier via serveur HTTP
 *
 * @param string filename - nom du fichier (relatif a l'alias)
 * @return string - url
 *
 **/
function getUrlHttpFromFilename($filename) {
    /* Windows : conversion separateurs repertoires en / */
    if (getOSType() == 'windows') {
	return "http://".$_SERVER['HTTP_HOST']."/".SHARE_PREFIX.preg_replace_callback("/([^\/]+)/", 'specialUrlEncode', str_replace("\\","/", $filename));
    } 
    /* Autre OS : conservation chemin */
    else {
	return "http://".$_SERVER['HTTP_HOST']."/".SHARE_PREFIX.preg_replace_callback("/([^\/]+)/", 'specialUrlEncode', $filename);
    }
}
function specialUrlEncode($matches) {
	/* MacOS / Linux : filename deja UTF-8 */
    if (getOSType() == 'windows') return rawurlencode(utf8_encode($matches[1]));
    else return rawurlencode($matches[1]);
}

/**
 * URL de lancement media via streamer externe
 *
 * @param string filename - nom du fichier (relatif a l'alias)
 * @return string - url
 *
 **/
function getUrlStreamFromFilename($filename) {
    return "http://".$_SERVER['HTTP_HOST']."/mp9ctl/?cmd=play&location=".urlencode($filename);
}

/** 
 * URL de lecture DVD via streamer externe
 *
 * @param string string path - chemin d'acces au DVD
 * @return string - url de lecture
 *
 **/
function getUrlStreamDvd($path) {
    return "http://".$_SERVER['HTTP_HOST']."/mp9ctl/?cmd=play&type=dvd&location=".urlencode(basename($path));
}

/** 
 * URL de lecture CD Audio via streamer externe
 *
 * @param string string path - chemin d'acces au CD Audio
 * @return string - url de lecture
 *
 **/
function getUrlStreamCDAudio($path) {
    return "http://".$_SERVER['HTTP_HOST']."/mp9ctl/?cmd=play&type=cdaudio&location=".urlencode(basename($path));
}

/**
 * SOUT
 *
 * @param string type - type de flux
 * @return string - SOUT
 *
 **/
function getSOUT($type) {
    return " :sout=#transcode{scodec=dvbs}:std{access=udp{ttl=2},mux=ts,dst=".$_SERVER['REMOTE_ADDR'].":".STREAMER_OUT_PORT."} ".($type == 'dvd' ? ' :dvdread-caching=500' : '').":sout-all";
}

/**
 * Detection d'un fichier SRT correspondant au fichier
 *
 * @param string filename - nom du fichier video relatif a l'alias de partage
 * @return string - nom du fichier SRT correspondant
 *
 **/
function srtFileExists($filename) {
    $realFile = getRealPath($filename);
    if (preg_match("/^(.*)\.(\w+)$/", $realFile, $matches)) {
	if (is_file($matches[1].".srt")) {
	    if (preg_match("/^(.*)\.(\w+)$/", $filename, $matches)) {
		return $matches[1].".srt";
	    }
	} else if (is_file($realFile.".srt")) return $filename.".srt";
    }
    return false;
}

/**
 * Detection d'un DVD
 *
 * @param string path - chemin courant
 *
 * @return boolean - DVD detecte
 *
 **/
function isDVD($filename) {
    /* Detection DVD sous Windows */
    if (getOSType() == 'windows') {
	if (is_dir(basename($filename)."/VIDEO_TS") && is_file(basename($filename)."/VIDEO_TS/VIDEO_TS.VOB")) return true;
    }
    return false;
}

/**
 * Detection d'un CD Audio
 *
 * @param string path - chemin courant
 *
 * @return boolean - CD Audio detecte
 *
 **/
function isCDAudio($filename) {
    /* Detection CDAudio sous Windows */
    if (getOSType() == 'windows') {
	if (is_file(basename($filename)."track01.cda")) return true;
    }
    return false;
}

/**
 * Tri d'une liste de medias ou dossiers
 *
 * @param array list - liste a trier (passage par reference)
 * @param integer sortby - critere de tri
 * @param boolean reverse - tri inverse
 *
 **/
function sortList(&$list, $sortBy, $reverse) {
    $cmpFunction = '';
    if ($sortBy == 'name') {
	$cmpFunction = 'sortByName'.($reverse?'Reverse':'');
    } else if ($sortBy == 'date') {
	$cmpFunction = 'sortByDate'.($reverse?'Reverse':'');
    } else {
	/* Tri non pris en compte */
	return false;
    }
    usort($list, $cmpFunction); 
}
function sortByName($a, $b) {
    if (strtolower($a['name']) < strtolower($b['name'])) return -1;
    else if (strtolower($a['name']) == strtolower($b['name'])) return 0;
    else return 1;
}
function sortByNameReverse($a, $b) {
    if (strtolower($a['name']) > strtolower($b['name'])) return -1;
    else if (strtolower($a['name']) == strtolower($b['name'])) return 0;
    else return 1;
}
    
?>
